package com.jky.stmall.front.service.impl;

import com.jky.stmall.front.entity.User;
import com.jky.stmall.front.mapper.UserMapper;
import com.jky.stmall.front.service.UserService;
import com.jky.stmall.front.util.MD5Util;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.UUID;

/**Spring注解
 * @Component 将类交给Spring的Bean容器管理
 * @Controller  继承Component，添加语义 代表Controller层
 * @RestController 继承自Controller 增加了返回JSON格式数据的功能
 * @Service   继承Component，添加语义 代表Service层
 * @Repository 继承Component，添加语义 代表持久层
 * @Configuration  继承Component，添加语义 代表配置信息
 *
 * @SpringbootAppliction 代表当前类是SpringBoot的启动类 必须要有 main方法
 * @MapperScan 整合包中的注解。基于Spring起作用 用于扫描指定包下的Mapper
 *
 * @SpringBootTest SpringBoot的测试类，基于JUnit进行测试
 *
 * @RequestMapping SpringMVC的注解 修改类。表示给类中的所有处理器方法 添加URL的前缀
 * @Transactional 放在Service层 为当前Service层的所有方法启动事物
 *
 * Mybatis注解
 * @Mapper Mybatis的注解 代表Mybatis的Mapper层 作用相当于@MapperScan
 * Lombok注解
 * @Data
 * @Getter
 * @Setter
 * @ToString
 * @NoArgsConstructor
 * @AllArgsConstructor
 *
 * 方法前的注解
 * @Override 最早的注解，表示当前的方法是重写父类的方法，java.long下的注解
 * SpringMVC
 * @RequestMapping 给处理器方法添加映射路径
 * @GetMapping    添加get请求的映射路径
 * @PostMapping   添加Post请求的映射路径
 * @PutMapping    添加put请求的映射路径
 * @DeleteMapping  添加delete请求的映射路径
 *
 * @ResponseBody  指定处理器方法，返回数据为JSON格式。Sprig底层需要Jackson包的支持
 *
 * JUnit注解
 * @Test
 * @Before
 * @After
 *
 * Spring的注解
 * @Transactional 给Service层的方法添加事务的支持
 * 隔离级别：5  默认 读未提交 读已提交 可重复读 串行化
 * 事物的传播机制： 7
 * Mybatis的注解
 * @Insert
 * @Options 配置自增主键
 * @Delete
 * @Update
 * @Select
 * @Results  配置映射
 *     @Result  配置映射字段与属性的映射关系
 *      @One
 *      @Many
 * @RestltMap 配置映射引用
 *
 * 属性前的注解
 * @Autowired Spring注解 用于自动注入属性，可以诸如私有的，不需要Set方法，优先根据类型注入
 * @Resource  javax.annotation的注解  在Spring下  也是自动注入  优先根据name注入
 * @Value Spring的注解 设置属性的值 可以配合${}表达式
 * @DateTimeFormat SpringMVC的注解，解析前端传递的时间字符串
 * @JsonFormat   jackson的注解 格式化类的对象时，格式化时间类型的字符串
 *
 * 参数的注解
 * @Param  MyBatis的注解  配置参数的名字  以便于在SQL语句中使用
 * 处理器方法的参数上有三种注解。
 * 1.@RequsetParam ：客户端参数名与服务端参数名不一致
 * 2.@RequestBody ：用来接收客户端传递的JSON格式的数据，解析JSON注入参数中
 * 3.@PathVariable： RESTful 路径参数
 * */

@Service
@AllArgsConstructor
public class UserServiceImpl implements UserService {
    private UserMapper userMapper;
    @Override
    public int reg(String username, String password, String rePassword) throws Exception {
        //1.参数验证
        if (username==null||username.length()<3||username.length()>16){
            throw new Exception("用户名必须是3~16位字符串");
        }
        if (password==null||password.length()<3||password.length()>16){
            throw new Exception("密码必须是3~16位字符串");
        }
        if (!password.equals(rePassword)){
            throw new Exception("两次密码不一致！！！");
        }
        //2.逻辑处理

        //3.访问数据库
        User user=userMapper.selectByUsername(username);
        if (user!=null){
            throw new Exception("用户名已被占用，换一个试试");

        }
        //密码加密
        //生成一个盐
        String salt=UUID.randomUUID().toString().substring(0,8);
        String md5Pwd= MD5Util.getMD5(password+salt);
        user=new User();
        user.setUsername(username);
        user.setSalt(salt);
        user.setPassword(md5Pwd);

        return userMapper.insert(user);
    }

    @Override
    public User login(User user) throws Exception {
        if (user.getUsername()==null||user.getUsername().length()<3||user.getUsername().length()>16){
            throw new Exception("用户名格式错误");
        }
        if (user.getPassword()==null||user.getPassword().length()<3||user.getPassword().length()>16){
            throw new Exception("密码格式不正常");
        }
        User sUser=userMapper.selectByUsername(user.getUsername());
        if (sUser==null){
            throw new Exception("用户名不存在");
        }
        //验证密码 将用户输入的密码 进行MD5加密，再与数据库密码进行比较
        String md5Pwd=MD5Util.getMD5(user.getPassword()+sUser.getSalt());
        if (!sUser.getPassword().equals(md5Pwd)){
            throw new Exception("密码不正确");
        }
        //状态

        if (sUser.getStatus()!=0){
            throw new Exception("用户被禁用，请联系管理员！！");
        }

        return sUser;
    }

    @Override
    public int modifyPwd(String username, String oldPassword, String newPassword, String rePassword) throws Exception {
        return 0;
    }

    @Override
    public int edit(User user) throws Exception {
        return 0;
    }

    @Override
    public int modifyPayPwd(String username, String password, String payPassword, String rePassword) throws Exception {
        return 0;
    }
}
